www.gusucode.com > VC++ HttpSocket文件下载类-源码程序 > VC++ HttpSocket文件下载类-源码程序/code/Httplinks/Http/SocketBuffer.cpp
//Download by http://www.NewXing.com // SocketBuffer.cpp: implementation of the CSocketBuffer class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "HttpSocket.h" #include "SocketBuffer.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSocketBuffer::CSocketBuffer(CHttpSocket* pSocket) { m_bEOF=FALSE; m_pSocket=pSocket; m_nCurPos=-1; m_nBufferSize=1024*10; m_nValidBufferSize=0; m_pBuffer=new char[m_nBufferSize+1]; memset(m_pBuffer,'\0',m_nBufferSize+1); /* ///读入第一段数据 m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); m_pBuffer[m_nValidBufferSize]='\0'; if(m_nValidBufferSize<=0) { m_bEOF=TRUE; } */ } CSocketBuffer::~CSocketBuffer() { if(m_pBuffer != NULL) delete []m_pBuffer; } ///读取一行 int CSocketBuffer::ReadLine(char *pLine, int nMaxLength) { if(m_nCurPos==-1) { ///读入第一段数据 m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); if(m_nValidBufferSize<=0) { m_pBuffer[0]='\0'; m_bEOF=TRUE; } else { m_pBuffer[m_nValidBufferSize]='\0'; m_nCurPos=0; } } ///从当前位置起读到一行的结束 int index=0; while(!m_bEOF && m_pBuffer[m_nCurPos]!='\n' && index<nMaxLength-1) { pLine[index]=m_pBuffer[m_nCurPos]; m_nCurPos++; index++; ///若指针大于缓冲的大小 if(m_nCurPos >= m_nValidBufferSize) { ///如果服务器中还有数据 if(m_nValidBufferSize > 0) { m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); if(m_nValidBufferSize <= 0) { m_pBuffer[0] = '\0'; m_bEOF = TRUE; } else { m_pBuffer[m_nValidBufferSize] = '\0'; m_nCurPos = 0; } } ///服务器中没有数据了,说明已经读取完毕 else { m_bEOF=TRUE; } } } pLine[index++]=m_pBuffer[m_nCurPos]; ///指针再下移一位跳过'\n' m_nCurPos++; return index; } ///读取指定的字节,返回实际读取的字节数. long CSocketBuffer::Read(BYTE *pBuffer, long nMaxLength) { long nLength=0; if(m_bEOF) { return 0; } if(m_nCurPos==-1) { ///读入第一段数据 m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); if(m_nValidBufferSize <= 0) { m_pBuffer[0]='\0'; m_bEOF=TRUE; } else { m_pBuffer[m_nValidBufferSize]='\0'; m_nCurPos=0; } } while(!m_bEOF && nLength<nMaxLength) { pBuffer[nLength]=m_pBuffer[m_nCurPos]; nLength++; m_nCurPos++; if(m_nCurPos>=m_nValidBufferSize) //缓冲区中的数据不足,则继续读取 { ///如果服务器中还有数据 if(m_nValidBufferSize > 0) { m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); if(m_nValidBufferSize <= 0) { m_pBuffer[0]='\0'; m_bEOF=TRUE; } else { m_pBuffer[m_nValidBufferSize]='\0'; m_nCurPos=0; } } ///服务器中没有数据了,说明已经读取完毕 else { m_bEOF=TRUE; } } } return nLength; } ///判断是否已经读取完毕 BOOL CSocketBuffer::IsEOF() { return m_bEOF; } /* ///若缓冲区中的数据长度大于请求的数据长度 if(m_nValidBufferSize-m_nCurPos>=nMaxLength) { memcpy(pBuffer,m_pBuffer+m_nCurPos,nMaxLength); nLength=nMaxLength; m_nCurPos+=nMaxLength; ///若缓冲区中的数据已经读完了 if(m_nCurPos>=m_nValidBufferSize) { ///继续取 if(m_nValidBufferSize>0) { m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); m_pBuffer[m_nValidBufferSize]='\0'; if(m_nValidBufferSize<=0) { m_bEOF=TRUE; } m_nCurPos=0; } else { ///文件已经结束 m_bEOF=TRUE; } } } ///缓冲区中的数据不够 else { ///先读取缓冲区中剩余的数据 memcpy(pBuffer,m_pBuffer+m_nCurPos,m_nValidBufferSize-m_nCurPos); nLength=m_nValidBufferSize-m_nCurPos; if(m_nValidBufferSize<=0) { ///文件结束 m_bEOF=TRUE; } else { ///递归读取下一段 m_nValidBufferSize=m_pSocket->Receive(m_pBuffer,m_nBufferSize); if(m_nValidBufferSize<=0) { m_bEOF=TRUE; } m_nCurPos=0; m_pBuffer[m_nValidBufferSize]='\0'; nLength+=Read(pBuffer+nLength,nMaxLength-nLength); } }*/ void CSocketBuffer::Attach(char *pBuffer, int nBufferSize) { delete []m_pBuffer; m_nBufferSize=nBufferSize; m_pBuffer=pBuffer; } char* CSocketBuffer::Detach() { char *pTemp; pTemp = m_pBuffer; m_pBuffer = NULL; return pTemp; } int CSocketBuffer::GetBufferSize() { return m_nBufferSize; } int CSocketBuffer::GetValidBufferSize() { return m_nValidBufferSize; } int CSocketBuffer::GetFileCurPos() { return m_nCurPos; } void CSocketBuffer::Seek(int nFileCurPos) { if(nFileCurPos >= 0 && nFileCurPos < m_nBufferSize) { m_nCurPos = nFileCurPos; } else { return ; } }